let fs = require('fs').promises;
let path = require('path');
let { PDFDocument } = require('pdf-lib');
let sharp = require('sharp');
let AdmZip = require('adm-zip'); // 用于解压 ZIP 文件

/**
 * 按创建时间排序文件
 * @param {string} imageDir - 图片目录
 * @param {string[]} imageFiles - 图片文件列表
 * @returns {Promise<string[]>} - 排序后的文件列表
 */
async function sortFilesByBirthtime(imageDir, imageFiles) {
  // 获取所有文件的状态信息
  let fileStats = await Promise.all(
    imageFiles.map(file => fs.stat(path.join(imageDir, file))),
  );
  // 将文件名和对应的 birthtime 组合成键值对
  let filesWithBirthtime = imageFiles.map((file, index) => {
    let birthtime = '';
    if (file.includes('UC多图下载')) {
      birthtime = Number(file.match(/\d+/g).join(''));
    } else {
      birthtime = fileStats[index].birthtime.getTime();
    }
    return { filename: file, birthtime };
  });
  // 按照 birthtime 排序
  filesWithBirthtime.sort((a, b) => a.birthtime - b.birthtime);
  // 提取排序后的文件名
  return filesWithBirthtime.map(item => item.filename);
}

/**
 * 将图片转换为 PDF
 * @param {string} imageDir - 图片目录
 * @param {string} outputPdfPath - 输出的 PDF 文件路径
 */
async function imagesToPdf(imageDir, outputPdfPath) {
  try {
    // 获取目录中的所有文件名
    let files = await fs.readdir(imageDir);
    // 过滤出只包含图片文件的数组
    let imageFiles = files.filter(file => /\.(webp|png|jpg|jpeg)$/i.test(file));
    if (imageFiles.length === 0) {
      console.log('No image files found.');
      return;
    }
    imageFiles = await sortFilesByBirthtime(imageDir, imageFiles);
    let pdfDoc = await PDFDocument.create();
    // 遍历每张图片并添加到 PDF 中
    let currIndex = 1;
    for (let file of imageFiles) {
      let imagePath = path.join(imageDir, file);
      let imageBuffer = await fs.readFile(imagePath);
      let jpgImageBytes = await sharp(imageBuffer).toFormat('jpeg').toBuffer();
      let image = await pdfDoc.embedJpg(jpgImageBytes);
      let dimensions = image.scale(1.0); // 不缩放图片
      let targetWidth = 612; // A4 页面宽度为 612 点 (72 DPI)
      // 计算宽高比并据此调整高度
      let aspectRatio = dimensions.width / dimensions.height;
      let targetHeight = targetWidth / aspectRatio;
      let page = pdfDoc.addPage([targetWidth, targetHeight]);
      page.drawImage(image, {
        x: 0,
        y: 0,
        width: targetWidth,
        height: targetHeight,
      });
      console.log(`Added ${file} to PDF. ${currIndex}`);
      currIndex++;
    }
    // 将生成的 PDF 写入文件
    let pdfBytes = await pdfDoc.save();
    await fs.writeFile(outputPdfPath, pdfBytes);
    console.log(`PDF saved as ${outputPdfPath}`);
  } catch (error) {
    console.error('An error occurred:', error.message);
  }
}

/**
 * 解压 ZIP 文件并处理其中的图片
 * @param {string} zipFilePath - ZIP 文件路径
 * @param {string} outputDir - 解压后的临时目录
 * @param {string} pdfOutputPath - 生成的 PDF 文件路径
 */
async function extractAndProcessZip(zipFilePath, outputDir, pdfOutputPath) {
  try {
    let zip = new AdmZip(zipFilePath);
    // 解压到临时目录
    zip.extractAllTo(outputDir, true);

    // 读取解压后的目录
    let items = await fs.readdir(outputDir, { withFileTypes: true });
    for (let item of items) {
      let itemPath = path.join(outputDir, item.name);
      if (item.isDirectory()) {
        // 如果是目录，递归处理
        await extractAndProcessZip(itemPath, outputDir, pdfOutputPath);
      } else if (/\.(webp|png|jpg|jpeg)$/i.test(item.name)) {
        // 如果是图片文件，直接处理
        await imagesToPdf(outputDir, pdfOutputPath);
        break; // 只处理一次，避免重复生成 PDF
      }
    }

    // 删除临时解压目录
    await fs.rm(outputDir, { recursive: true, force: true });
    console.log(`Deleted temporary directory: ${outputDir}`);
  } catch (error) {
    console.error('Failed to process ZIP file:', error.message);
  }
}

/**
 * 处理总目录入口
 * @param {string} rootDir - 总目录路径
 */
async function processRootDirectory(rootDir) {
  try {
    // 读取总目录中的所有文件
    let items = await fs.readdir(rootDir, { withFileTypes: true });
    for (let item of items) {
      if (item.isFile() && item.name.endsWith('.zip')) {
        // 如果是 ZIP 文件
        let zipFilePath = path.join(rootDir, item.name);
        let tempOutputDir = path.join(rootDir, `temp_${path.basename(item.name, '.zip')}`);
        let pdfOutputPath = path.join(rootDir, `${path.basename(item.name, '.zip')}.pdf`);

        // 创建临时解压目录
        await fs.mkdir(tempOutputDir, { recursive: true });

        // 解压并处理 ZIP 文件
        await extractAndProcessZip(zipFilePath, tempOutputDir, pdfOutputPath);
      }
    }
  } catch (error) {
    console.error('Failed to process root directory:', error.message);
  }
}

// 使用示例
let rootDirectory = 'D:\\360安全浏览器下载\\新建文件夹'; // 替换为你的总目录路径
processRootDirectory(rootDirectory);
